"""
Python的内置函数
- 数学相关: abs / divmod / pow / round / min / max / sum  
    作用: 取绝对值 / 取商和余数 / 求幂 / 四舍五入 / 取最小值 / 取最大值 / 求和
- 序列相关: len / range / next / filter / map / sorted / slice / reversed
    作用: 取长度 / 生成序列 / 取下一个元素 / 过滤序列 / 映射序列 / 排序 / 切片 / 反转序列
- 类型转换: chr / ord / str / bool / int / float / complex / bin / oct / hex
    作用: 取字符 / 取整数 / 转字符串 / 转布尔值 / 转整数 / 转浮点数 / 转复数 / 转二进制 / 转八进制 / 转十六进制
- 数据结构: dict / list / set / tuple
    作用: 字典 / 列表 / 集合 / 元组
- 其他函数: all / any / id / input / open / print / type
    作用: 所有元素为真 / 存在真元素 / 取地址 / 输入 / 打开文件 / 打印 / 取类型

- 其他内置函数: help / dir / globals / locals / exec / eval

"""

# 自定义函数
def myfilter(mystr):
    return len(mystr) == 6


# 1.数学相关
print(abs(-10))  # 10       # 取绝对值
print(divmod(10, 3))  # (3, 1)    # 取商和余数  返回一个元组，第一个元素是商，第二个元素是余数
print(pow(2, 3))  # 8         # 求幂 
print(round(3.1415926, 2))  # 3.14         # 四舍五入  第一个参数是数值，第二个参数是保留的小数位数
print(min(1, 2, 3, 4, 5))  # 1       最小值
print(max(1, 2, 3, 4, 5))  # 5       最大值
print(sum([1, 2, 3, 4, 5]))  # 15      对列表（参数是可迭代对象）求和

# 2.序列相关
print(len('hello'))            #    取长度
print(range(1,15,2))   # 生成序列   返回是一个迭代器，直接打印是range对象，需要用list()函数转换成列表，再输出，或用for循环遍历输出。 
print(list(range(1,15,2)))  # [1, 3, 5, 7, 9, 11, 13]
print(next(iter([1, 2, 3, 4, 5])))  # 1   # 取下一个元素   第一个参数是可迭代对象，
# iter()函数可以把列表、元组、字符串等可迭代对象转换成迭代器。next()函数可以从迭代器中取出下一个元素，每次只能取一次。
# print(next([1, 2, 3, 4, 5]))    # 这是不行的，因为[1, 2, 3, 4, 5]是一个列表，不是迭代器。列表是迭代对象，但不是迭代器。

# 过滤序列 语法: filter(函数,序列)，参数函数调用时得到列表的每一个元素，如果函数返回True则保留该元素。即用filter中第一个参数（函数）来过滤第二个参数（序列）中的元素。
# 因filter 返回的是一个迭代器,filter.，所以要用list()函数转换成列表，再输出来。
print(list(filter(myfilter, ['apple', 'banana', 'orange', 'pear']))) 
print(list(map(lambda x: x*2, [1, 2, 3, 4, 5])))  # [2, 4, 6, 8, 10]      # 映射序列  第一个参数是函数，第二个参数是序列，函数调用时得到列表的每一个元素，然后参与函数运算，返回值是一个可迭代器map，所以用list()函数转换成列表。

print(sorted([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]))  # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]   给序列排序 参数是可迭代对象，返回值是一个新的列表
sorted([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5], reverse=True)  # [9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]  给序列排序，参数reverse=True，则降序排序
print(list(reversed([1, 2, 3, 4, 5])))  # [5, 4, 3, 2, 1]     把序列反转，返回值是一个新的列表
# - 添加索引   使用enumerate()函数，可以把序列中的元素和索引组成一个元组，然后用列表推导式生成新的列表。
mylist = ['apple', 'banana', 'orange']
mylist = list(enumerate(mylist))  # 省略start参数，则索引从0开始
print(mylist)  # [(0, 'apple'), (1, 'banana'), (2, 'orange')]


# 3.类型转换    
print(chr(65))  # 'A'
print(ord('A'))  # 65
print(str(123))  # '123'
print(bool(1))  # True


# 4.数据结构
print(dict(name='Alice', age=25))  # {'name': 'Alice', 'age': 25}
print(list(['apple', 'banana', 'orange']))  # ['apple', 'banana', 'orange']
print(set([1, 2, 3, 3, 4, 4, 5]))  # {1, 2, 3, 4, 5}
print(tuple((1, 2, 3)))  # (1, 2, 3)

# 5.其他函数
print(all([True, True, True]))  # 判断所有元素是否为真，返回布尔值
print(any([True, False, True]))  # 判断是否存在真元素，返回布尔值
print(id(123))  # 45645123456  
print(input('Enter your name:'))  # 输入 

isinstance(123, int)  # True   检查对象类型
isinstance('hello', str)  # True
isinstance([1, 2, 3], list)  # True

# hasattr(), getattr(), setattr(), delattr() - 对象属性操作
class Example: 
    pass
obj = Example()
hasattr(obj, 'name')  # False  检查对象是否有某个属性,
setattr(obj, 'name', 'test')
getattr(obj, 'name')  # 'test'



#迭代器 vs 可迭代对象
# 特性	可迭代对象 (Iterable)	迭代器 (Iterator)
# 定义	实现了 __iter__() 方法	实现了 __iter__() 和 __next__()
# 能否直接迭代	需要先获取迭代器	可以直接迭代
# 状态	无状态	有状态（记录当前位置）
# 示例	列表、元组、字典、集合	文件对象、生成器、zip/map结果
# enumerate()：带索引的迭代
# zip()：并行迭代
# map()：映射迭代
# filter()：过滤迭代
# reversed()：反向迭代